package com.xbongbong.paas.service;

import com.xbongbong.paas.pojo.dto.AddCommunicateDTO;
import com.xbongbong.paas.pojo.dto.AliyunCallGetCompanyReqDTO;
import com.xbongbong.paas.pojo.dto.AliyunCallTimeFilterResultReqDTO;
import com.xbongbong.paas.pojo.dto.AutoCommunicateDTO;
import com.xbongbong.paas.pojo.dto.CallAppFiltersDTO;
import com.xbongbong.paas.pojo.dto.*;
import com.xbongbong.paas.pojo.dto.CallCenterFindRefDTO;
import com.xbongbong.paas.pojo.dto.CallCenterLoginDTO;
import com.xbongbong.paas.pojo.dto.CallCenterModuleDTO;
import com.xbongbong.paas.pojo.dto.CallCustomerDisturbDTO;
import com.xbongbong.paas.pojo.dto.CallFindRefDTO;
import com.xbongbong.paas.pojo.dto.CallMobileCallDTO;
import com.xbongbong.paas.pojo.dto.CallMobileCodeSendDTO;
import com.xbongbong.paas.pojo.dto.CallMobileCodeVerifyDTO;
import com.xbongbong.paas.pojo.dto.CallSyncDepartmentDTO;
import com.xbongbong.paas.pojo.dto.CallTokenRefreshDTO;
import com.xbongbong.paas.pojo.dto.CallUpdateModuleDTO;
import com.xbongbong.paas.pojo.vo.AddCommunicateVO;
import com.xbongbong.paas.pojo.vo.AutoCommunicateVO;
import com.xbongbong.paas.pojo.vo.CallAppFiltersVO;
import com.xbongbong.paas.pojo.vo.CallCenterAccountUserInfoVO;
import com.xbongbong.paas.pojo.vo.CallCenterLoginVO;
import com.xbongbong.paas.pojo.vo.CallCenterModuleVO;
import com.xbongbong.paas.pojo.vo.CallCustomerDisturbVO;
import com.xbongbong.paas.pojo.vo.CallFindRefVO;
import com.xbongbong.paas.pojo.vo.CallMobileCallVO;
import com.xbongbong.paas.pojo.vo.CallMobileCodeSendVO;
import com.xbongbong.paas.pojo.vo.CallMobileCodeVerifyVO;
import com.xbongbong.paas.pojo.vo.CallSyncDepartmentVO;
import com.xbongbong.paas.pojo.vo.CallTokenRefreshVO;
import com.xbongbong.paas.pojo.vo.CallUpdateModuleVO;
import com.xbongbong.paas.pojo.vo.DuYanCallLogVO;
import com.xbongbong.paas.pojo.vo.GetCompanyVO;
import com.xbongbong.paas.pojo.vo.GetSysVisibleVO;
import com.xbongbong.paas.pojo.vo.IsActiveAliyunCallVO;
import com.xbongbong.paas.pojo.vo.TimeFilterResultVO;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.wrap.XbbResponse;
import com.xbongbong.pro.menu.pojo.vo.ControlCenterMenuVO;
import com.xbongbong.pro.menu.pojo.vo.PaasAppMenuVO;
import com.xbongbong.saas.domain.entity.CallCenterAccountEntity;
import com.xbongbong.saas.domain.entity.CallCenterCallLogEntity;
import com.xbongbong.sys.domain.entity.CompanyEntity;
import com.xbongbong.sys.domain.entity.DepartmentEntity;

import java.util.List;

/**
 * @author youli.chen
 * @version v1.0
 * @description: 话务中心通用 业务层接口
 * @date 2019/2/12 16:38
 * @since v1.0
 */
public interface CallCenterCommonService {

    /**
     * 校验是否为话务中心模块
     *
     * @param moduleType 微应用模块类型，参考CallCenterTypeEnum
     * @return boolean false：话务中心模块
     * @throws XbbException 业务异常
     * @author youli.chen
     * @version v1.0
     * @since v1.0
     */
    boolean notCallCenterModule(Integer moduleType) throws XbbException;

    /**
     * web端
     * 校验当前用户对应的公司是否开启呼叫中心并且是坐席用户(对应的呼叫中心功能模块是否开放,坐席用户开放模块)
     * @return 开通了呼叫中心并且是坐席：true 没有开通呼叫中心或是非坐席：false
     * @throws XbbException 业务异常
     * @author youli.chen
     * @version v1.0
     * @since v1.0
     */
    boolean isOpenCallAndAgent(String corpid, String userId) throws XbbException;

    /**
     * 移动端
     * 校验当前用户对应的公司是否开启呼叫中心并且是坐席用户(对应的呼叫中心功能模块是否开放,坐席用户开放模块)
     * 获取当前开启的呼叫平台对应的模块权限
     * @return 开通了呼叫中心并且是坐席：true 没有开通呼叫中心或是非坐席：false
     * @param corpid 公司id
     * @param userId 用户ID
     * @throws XbbException 业务异常
     * @author youli.chen
     * @version v1.0
     * @since v1.0
     */
    boolean isOpenCallDingTalk(String corpid, String userId) throws XbbException;

    /**
     * 校验手机号是否正确
     *
     * @param phoneNum 手机号码（提前校验不为空）
     * @return boolean 错误号码格式：true 正确号码格式：false
     * @throws XbbException 业务异常
     * @author youli.chen
     * @version v1.0
     * @since v1.0
     */
    boolean isWrongMobilePhoneNum(String phoneNum) throws XbbException;

    /**
     * 获取话务中心平台管理员的token
     *
     * @param corpid     公司id
     * @param moduleType 第三方话务平台，参考CallCenterTypeEnum
     * @param accountId  员工的话务中心账户
     * @return token 登录验证
     * @throws XbbException 业务异常
     * @author youli.chen
     * @version v1.0
     * @since v1.0
     */
    String getAdminToken(String corpid, Integer moduleType, String accountId) throws XbbException;

    /**
     * 获取话务中心平台员工的token
     *
     * @param apiKey                  公司在第三方话务平台的主键
     * @param callCenterAccountEntity 员工的话务中心账户
     * @return token 登录验证
     * @throws XbbException 业务异常
     * @author youli.chen
     */
    String getAccountToken(String apiKey, final CallCenterAccountEntity callCenterAccountEntity) throws XbbException;

    /**
     * 获取开启的话务中心平台（一家公司只能开启一个平台）
     *
     * @param callCenterModuleDTO 获取开启的话务中心平台入参
     * @return CallCenterModuleVO
     * @throws XbbException 业务异常
     */
    CallCenterModuleVO module(CallCenterModuleDTO callCenterModuleDTO) throws XbbException;

    /**
     * 更换呼叫中心（一家公司只能使用一个平台）
     *
     * @param callUpdateModuleDTO 更换呼叫中心入参
     * @return CallUpdateModuleVO
     * @throws XbbException 业务异常
     */
    XbbResponse<CallUpdateModuleVO> updateModuleType(CallUpdateModuleDTO callUpdateModuleDTO) throws XbbException;

    /**
     * 根据呼叫手机号查找对象
     *
     * @param callFindRefDTO 根据呼叫手机号查找对象入参
     * @return CallFindRefVO
     * @throws XbbException 业务异常
     */
    XbbResponse<CallFindRefVO> findRef(CallFindRefDTO callFindRefDTO) throws XbbException;

    /**
     * 用户一键登录使用的token或提醒用户进行注册
     *
     * @param callCenterLoginDTO 用户一键登录使用的token或提醒用户进行注册入参
     * @return CallCenterLoginVO
     * @throws XbbException 业务异常
     */
    XbbResponse<CallCenterLoginVO> login(CallCenterLoginDTO callCenterLoginDTO) throws XbbException;

    /**
     * 刷新token(用户一键登录使用的token或提醒用户进行注册)
     *
     * @param callTokenRefreshDTO 刷新token(用户一键登录使用的token或提醒用户进行注册)入参
     * @return CallTokenRefreshVO
     * @throws XbbException 业务异常
     */
    XbbResponse<CallTokenRefreshVO> tokenRefresh(CallTokenRefreshDTO callTokenRefreshDTO) throws XbbException;

    /**
     * 获取手机验证码
     *
     * @param callMobileCodeSendDTO 获取手机验证码入参
     * @return
     * @throws XbbException 业务异常
     */
    XbbResponse<CallMobileCodeSendVO> mobileCodeSend(CallMobileCodeSendDTO callMobileCodeSendDTO) throws XbbException;

    /**
     * 验证手机验证码
     *
     * @param callMobileCodeVerifyDTO 验证手机验证码入参
     * @return
     * @throws XbbException 业务异常
     */
    XbbResponse<CallMobileCodeVerifyVO> mobileCodeVerify(CallMobileCodeVerifyDTO callMobileCodeVerifyDTO) throws XbbException;

    /**
     * 移动端获取呼出号码（呼出线路）
     *
     * @param callMobileCallDTO 移动端获取呼出号码（呼出线路）
     * @return
     * @throws XbbException 业务异常
     */
    XbbResponse<CallMobileCallVO> mobileCall(CallMobileCallDTO callMobileCallDTO) throws XbbException;

    /**
     * 获取移动端上的话务中心的筛选栏项目（度言）
     *
     * @param callAppFiltersDTO 获取移动端上的话务中心的筛选栏项目（度言）
     * @return
     * @throws XbbException 业务异常
     */
    XbbResponse<CallAppFiltersVO> workOrderFilterSet(CallAppFiltersDTO callAppFiltersDTO) throws XbbException;

    /**
     * 在度言平台注册企业信息
     *
     * @param corpid           企业id
     * @param moduleType       微应用平台
     * @param name             企业注册的全民
     * @param alias            企业简称
     * @param registerId       企业的统一信用代码
     * @param isAudioTranslate 语音翻译功能
     * @param platformLine     平台线路
     * @param unitPrice        价格
     * @return String 企业的org_id（失败则返回null）
     * @throws XbbException 业务错误
     * @author youli.chen
     * 创建时间：2017/11/2 下午3:59
     * 修改时间：
     * @version
     * @since 3.14
     */
    boolean registerOrganization(String corpid, Integer moduleType, String name, String alias,
                                 String registerId, Boolean isAudioTranslate, Integer platformLine, String unitPrice) throws XbbException;

    /**
     * 设置员工权限时如果还未注册到话务中心平台，先进行注册
     *
     * @param apiKey     企业的话务中心校验码
     * @param moduleType 话务中心平台号
     * @param corpid     公司ID
     * @param userId     用户ID
     * @return CallCenterAccountUserInfoVO 注册成功的用户信息
     * @throws XbbException 销帮帮设定的异常
     * @author youli.chen
     * 创建时间：2017/11/08 下午5:00
     * 修改时间：
     * @version
     * @since 3.14
     */
    CallCenterAccountUserInfoVO registerAccount(String apiKey, Integer moduleType, String corpid, String userId) throws XbbException;

    /**
     * 查找远程通话记录的详情
     *
     * @param apikey     公司在第三方话务平台的主键
     * @param moduleType 第三方话务平台，参考AppStoreTypeEnum
     * @param callUuid   通话录音的唯一标识
     * @return CallCenterCallLogEntity 封装的通话记录
     * @throws XbbException 销帮帮设定的异常
     * @author youli.chen
     * 创建时间：2017/11/24 下午3:02
     * 修改时间：
     * @version
     * @since 3.13.6
     */
    CallCenterCallLogEntity getOriginCallLogDetail(String apikey, Integer moduleType, String callUuid) throws XbbException;

    /**
     * 封装度言通话记录数据
     *
     * @param callLogEntity
     * @param duYanCallLogVO
     * @return
     */
    CallCenterCallLogEntity packageDuYanCallLogEntity(CallCenterCallLogEntity callLogEntity, DuYanCallLogVO duYanCallLogVO);

    /**
     * 封装销帮帮呼叫中心通话记录数据
     *
     * @param callLogEntity
     * @param callCallLogSaveDTO
     * @return
     */
    CallCenterCallLogEntity packageXbbCallLogEntity(CallCenterCallLogEntity callLogEntity, CallCallLogSaveDTO callCallLogSaveDTO);

    /**
     * 拨号后自动添加跟进记录
     *
     * @param autoCommunicateDTO 拨号后自动添加跟进记录入参
     * @return AutoCommunicateVO  拨号后自动添加跟进记录回参
     * @throws XbbException 销帮帮设定的异常
     * @author youli.chen
     * 创建时间：2017/12/11 下午4:51
     * @version v1.0
     * @since v1.0
     */
    AutoCommunicateVO autoCommunicate(AutoCommunicateDTO autoCommunicateDTO) throws XbbException;


    /**
     * 根据对象的通话号码查找对象（客户或联系人或线索）
     *
     * @param corpid    公司id
     * @param refMobile 用于查询的通话号码
     * @return Object 对象（客户或联系人或线索）
     * @throws XbbException 销帮帮设定的异常
     * @author youli.chen
     * 创建时间：2017/11/1 上午10:19
     * @version v1.0
     * @since v1.0
     */
    CallCenterFindRefDTO findRefByPhoneNum(String corpid, String refMobile) throws XbbException;

    /**
     * 同步组织架构到度言（销帮帮）
     *
     * @param callSyncDepartmentDTO 同步组织架构到度言（销帮帮）入参
     * @return CallSyncDepartmentVO  同步组织架构到度言（销帮帮）回参
     * @throws XbbException 业务异常
     */
    XbbResponse<CallSyncDepartmentVO> syncDepartment(CallSyncDepartmentDTO callSyncDepartmentDTO) throws XbbException;

    /**
     * 客户防骚扰缓存比对
     *
     * @param callCustomerDisturbDTO 客户防骚扰缓存比对入参
     * @return CallCustomerDisturbVO  客户防骚扰缓存比对回参
     * @throws XbbException 业务异常
     */
    XbbResponse<CallCustomerDisturbVO> customerDisturb(CallCustomerDisturbDTO callCustomerDisturbDTO) throws XbbException;

    /**
     * 如果公司未同步组织架构，则同步公司的组织架构去第三方话务中心平台维护
     *
     * @param corpid          公司id
     * @param moduleType      第三方话务平台，参考AppStoreTypeEnum
     * @param depId           部门id
     * @param phoneVisibility 号码是否对团队成员隐藏:PUBLIC:公开,PRIVATE:隐藏,MEMBER_PRIVATE:对团队管理员公开,普通坐席隐藏
     * @return List<CallCenterTeamEntity> 组装的本地维护的企业部门，缺少orgId
     * @throws XbbException 业务异常
     * @author youli.chen
     * 创建时间：2017/11/1 上午10:19
     * @version v1.0
     * @since v1.0
     */
    void syncCallCenterDepartment(String corpid, Integer moduleType, Long depId, String phoneVisibility) throws XbbException;

    /**
     * 校验公司启用的组织架构层级并返回公司的组织架构
     *
     * @param moduleType           第三方话务平台，参考AppStoreTypeEnum
     * @param rootDepIdStr         需要校验的部门队列的根部门的部门id字符串（包含前后"|"）
     * @param departmentEntityList 公司需要同步的组织架构，进行同步
     * @return List<DepartmentEntity> 公司的组织架构
     * @author youli.chen
     * 创建时间：2017/11/1 上午10:19
     * @version v1.0
     * @since v1.0
     */
    boolean checkDepartmentRouter(Integer moduleType, String rootDepIdStr, List<DepartmentEntity> departmentEntityList);

    /**
     * 同步公司的组织架构去第三方话务中心平台维护
     *
     * @param corpid               公司id
     * @param orgId                公司在第三方话务中心的公司id
     * @param apiKey               公司在第三方话务平台的主键
     * @param moduleType           第三方话务平台，参考AppStoreTypeEnum
     * @param departmentEntityList 公司的所有部门
     * @param phoneVisibility      号码是否对团队成员隐藏:PUBLIC:公开,PRIVATE:隐藏,MEMBER_PRIVATE:对团队管理员公开,普通坐席隐藏
     * @return List<CallCenterTeamEntity> 组装的本地维护的企业部门，缺少orgId
     * @throws XbbException 业务异常
     * @author youli.chen
     * 创建时间：2017/11/1 上午10:19
     * @version v1.0
     * @since v1.0
     */
    void syncCallCenterDepartment(String corpid, String orgId, String apiKey, Integer moduleType,
                                  List<DepartmentEntity> departmentEntityList,
                                  String phoneVisibility) throws XbbException;

    /**
     * 切换员工的呼叫中心部门
     *
     * @param corpid     公司id
     * @param userInfoVO 员工的本地持久化呼叫中心账户
     * @param depId      部门id
     * @return 保存成功与否
     * @throws XbbException 业务异常
     * @author youli.chen
     * 创建时间：2017/11/1 上午10:19
     * @version v1.0
     * @since v1.0
     */
    boolean changeAccountDep(String corpid, CallCenterAccountUserInfoVO userInfoVO, Long depId) throws XbbException;

    /**
     * 清除员工的话务中心角色
     * @param corpId 公司id
     * @param userId 用户id
     * @author 陈有利
     * 创建时间：2017/12/15 上午9:51
     * 修改时间：
     * @version
     */
    void removeCallCenterPosition(String corpId, String userId) throws XbbException;
    /*
     * description:
     * date: 2021/7/16 8:59 上午
     * @Author yingjf
     */
    AddCommunicateVO addCommunicate(AddCommunicateDTO addCommunicateDTO) throws XbbException;
    /*
     * 获取timeFilter配置
     */
    TimeFilterResultVO getTimeFilterResult(AliyunCallTimeFilterResultReqDTO aliyunCallTimeFilterResultReqDTO)throws XbbException;

    /*
     * 判断是否开通云呼且至少为一种角色
     */
    IsActiveAliyunCallVO isActiveAliyunCall(String corpid, String userId)throws XbbException;

    /*
     * 查询公司信息
     */
    XbbResponse<CompanyEntity> getCompany(AliyunCallGetCompanyReqDTO aliyunCallGetCompanyReqDTO)throws XbbException;

    /*
     * 组装移动端云呼菜单
     */
    PaasAppMenuVO getMenuList(String platform, int role, Integer facilitators)throws XbbException;

    /**
     * 组装管理中心的云呼中的菜单
     * @param platform
     * @return
     * @throws XbbException
     */
    ControlCenterMenuVO getManagementCenterMenuList(String platform, int role, Integer facilitators) throws XbbException;
    /**
     * 查询号码系统可见性
     */
    GetSysVisibleVO getSysVisible(GetSysVisibleDTO getSysVisibleDTO)throws XbbException;
}
